package day19.zhiyou100;

class TestProduct {
    public static void main(String[] args) {
        Product p = new Product(1,"手机");
        ConsumerThread consumer = new ConsumerThread(p,"消费者线程");
        ProducerThread producer = new ProducerThread(p,"生产着线程");
        consumer.start();
        producer.start();
    }
}


// 需要有两个线程 线程内容是不一样的
//消费者线程
class ConsumerThread extends Thread{
    // 共享同一个产品
    private Product product;

    public ConsumerThread(Product product,String name) {
        super(name);
        this.product = product;
    }

    // 重写run方法
    @Override
    public void run() {
        while (true) {
            synchronized (product) {
                if (product.getNum() == 0) {
                   /* try {
                        //product.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }*/
                    product.notify();
                } else {
                    System.out.println("此时产品是有值的，消费着开始消费");
                    product.setNum(0);
                    product.notify();
                    /* try {
                        product.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }*/
                    System.out.println(this.getName() + "---->消费了产品，通知生产着去生产");
                }
            }
        }
    }

}


// 生产着线程
class ProducerThread extends Thread {
    // 共享同一个产品
    private Product product;

    public ProducerThread(Product product,String name) {
        super(name);
        this.product = product;
    }

    // 重写run方法
    @Override
    public  void run() {
        // 生产
        // 首先判断product有没有值
        while (true) {
            synchronized (product) { // 在程序当中product始终只会创建一次
                if (product.getNum() == 0) {
                    System.out.println("此时产品没有值，生产着开始生产。。。");
                    // num为0代表该产品没有值 生产
                    product.setNum(1);
                    // 通知消费者线程去消费 synchronized
                    product.notify();
                    // 进入等待状态
                    System.out.println("生产着生产完毕进入等待状态，通知消费者去消费");
                } else {
                    // 不能生产
                    // 进入到等待状态
                    try {
                        product.wait();
                        //product.notify();// 通知消费着去消费
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

public class Product {

    // 提供一些属性
    private int num;// 产品的数量
    private String name;// 产品的名称

    public Product() {
    }

    public Product(int num, String name) {
        this.num = num;
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
